﻿using System.Collections.Generic;

namespace System.Linq.Reactive
{
    /// <summary>Простейший наблюдаемый объект</summary><typeparam name="T">Тип объектов событий</typeparam>
    public class SimpleObservableEx<T> : IObservableEx<T>
    {
        /// <summary>Список объектов наблюдателей</summary>
        protected readonly List<IObserverEx<T>> f_Observers = new List<IObserverEx<T>>();

        /// <summary>Метод генерации следующего события</summary>
        /// <param name="item">Объект события</param>
        public void OnNext(T item) { f_Observers.ForEach(o => o.OnNext(item)); }

        /// <summary>Метод генерации события завершения последовательности</summary>
        public void OnComplited() { f_Observers.ForEach(o => o.OnComplited()); }

        /// <summary>Метод генерации события сброса последовательности</summary>
        public void OnReset() { f_Observers.ForEach(o => o.OnReset()); }

        /// <summary>Метод генерации события исключения</summary>
        /// <param name="error">Пробрасываемое исключения</param>
        public void OnException(Exception error) { f_Observers.ForEach(o => o.OnException(error)); }

        /// <summary>Метод получения нового наблюдателя</summary>
        /// <returns>Наблюдатель</returns>
        public virtual IObserverEx<T> GetObserver()
        {
            var observer = new SimpleObserverEx<T>();
            f_Observers.Add(observer);
            return observer;
        }
    }
}